AWS CLI を利用して AWS Security Hub の検出結果から未利用の IAM ユーザーを評価する Config ルールが非準拠となっているユーザー一覧を取得してみた
AWS CLI を利用して AWS Security Hub の検出結果から未利用の IAM ユーザーを評価する Config ルールが非準拠となっているユーザー一覧を取得してみたので備忘録も兼ねてブログ化します。また、AWS Security Hub のインサイトを作成して、インサイトから取得する例も試しています。
事前に下記ブログで紹介している未利用の IAM ユーザーを検出する Config ルール「iam-user-unused-credentials-check」を展開済みの環境で試しています。
先にコマンドだけ掲載します。
configRuleName
には iam-user-unused-credentials-check を展開している Config ルール名を指定してください。アカウント ID と IAM ユーザー名を出力します。
configRuleName="iam-user-unused-credentials-check"
aws securityhub get-findings \
--filters "{\"Title\":[{\"Value\":\"$configRuleName\",\"Comparison\":\"EQUALS\"}],\"ComplianceStatus\":[{\"Value\":\"FAILED\",\"Comparison\":\"EQUALS\"}],\"ProductName\":[{\"Value\":\"Config\",\"Comparison\":\"EQUALS\"}]}" \
--query 'sort_by(Findings,&AwsAccountId)[].[AwsAccountId,Resources[]|[0].Details.AwsIamUser.UserName]' \
--output text
出力結果例です。
111122223333 sandbox01-iam-user
444455556666 mgmt-iam-user
以降では、紹介したコマンドの説明とインサイトを利用した別パターンを記載します。
AWS Security Hub の検出結果から取得する
AWS CLI において、AWS Security Hub の検出結果(Findings)をフィルターして出力できるコマンドはget-findings
です。
次のフィルター条件で出力してみます。
項目 | 条件 | 値 |
---|---|---|
タイトル | 次と同じ | OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq |
コンプライアンスのステータス | 次と同じ | FAILED |
製品名 | 次と同じ | Config |
上記のフィルターを設定したコマンドです。
aws securityhub get-findings \
--filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}'
出力結果例です。長いので一つの Finding のみ記載しています。
$ aws securityhub get-findings --filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}'
{
"Findings": [
{
"SchemaVersion": "2018-10-08",
"Id": "arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia/finding/929e2a4b910d2b7e605d9e289c77b512403f176b",
"ProductArn": "arn:aws:securityhub:ap-northeast-1::product/aws/config",
"ProductName": "Config",
"CompanyName": "AWS",
"Region": "ap-northeast-1",
"GeneratorId": "arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia",
"AwsAccountId": "444455556666",
"Types": [
"Software and Configuration Checks"
],
"CreatedAt": "2024-09-12T14:14:23.305Z",
"UpdatedAt": "2024-09-12T14:14:23.305Z",
"Severity": {
"Label": "MEDIUM",
"Normalized": 40
},
"Title": "OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq",
"Description": "This finding is created for a resource compliance change for config rule: OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq",
"ProductFields": {
"aws/securityhub/ProductName": "Config",
"aws/securityhub/CompanyName": "AWS",
"aws/securityhub/FindingId": "arn:aws:securityhub:ap-northeast-1::product/aws/config/arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia/finding/929e2a4b910d2b7e605d9e289c77b512403f176b",
"aws/config/ConfigRuleArn": "arn:aws:config:ap-northeast-1:444455556666:config-rule/aws-service-rule/config-multiaccountsetup.amazonaws.com/config-rule-z6a5ia",
"aws/config/ConfigRuleName": "OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq",
"aws/config/ConfigComplianceType": "NON_COMPLIANT"
},
"Resources": [
{
"Type": "AwsIamUser",
"Id": "arn:aws:iam::444455556666:user/mgmt-iam-user",
"Partition": "aws",
"Region": "ap-northeast-1",
"Details": {
"AwsIamUser": {
"AttachedManagedPolicies": [
{
"PolicyName": "ViewOnlyAccess",
"PolicyArn": "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess"
}
],
"CreateDate": "2024-08-30T01:48:16.000Z",
"Path": "/",
"UserId": "AIDAYS2NWB5DIPEXAMPLE",
"UserName": "mgmt-iam-user"
}
}
}
],
"Compliance": {
"Status": "FAILED"
},
"WorkflowState": "NEW",
"Workflow": {
"Status": "NEW"
},
"RecordState": "ACTIVE",
"FindingProviderFields": {
"Severity": {
"Label": "MEDIUM"
},
"Types": [
"Software and Configuration Checks"
]
},
"ProcessedAt": "2024-09-12T14:14:38.198Z",
"AwsAccountName": "example"
},
(中略)
]
}
出力内容の中から、アカウント ID と IAM ユーザー名だけを出力するように query オプションを利用したコマンド例です。アカウント ID でソートもしています。
aws securityhub get-findings \
--filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}' \
--query 'sort_by(Findings,&AwsAccountId)[].[AwsAccountId,Resources[]|[0].Details.AwsIamUser.UserName]' \
--output text
出力結果例です。
$ aws securityhub get-findings \
> --filters '{"Title":[{"Value":"OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}],"ProductName":[{"Value":"Config","Comparison":"EQUALS"}]}' \
> --query 'sort_by(Findings,&AwsAccountId)[].[AwsAccountId,Resources[]|[0].Details.AwsIamUser.UserName]' \
> --output text
111122223333 sandbox01-iam-user
444455556666 mgmt-iam-user
AWS Security Hub の検出結果(Findings)を AWS CLI で取得できることを確認できました。
冒頭で紹介したコマンドはタイトルである Config ルール名を変数化しています。
AWS Security Hub のインサイトから取得する
AWS CLI を用いて、AWS Security Hub のインサイトの結果を取得することもできます。
テスト用に次のインサイトを作成して AWS CLI で結果を取得できるか試してみます。
- インサイト名:IamUserUnusedCredentialsCheck
- グループ化条件:リソース ID
- フィルター:下表参照
項目 | 条件 | 値 |
---|---|---|
タイトル | 次と同じ | OrgConfigRule-iam-user-unused-credentials-check-ieljkhjq |
コンプライアンスのステータス | 次と同じ | FAILED |
製品名 | 次と同じ | Config |
インサイトの条件を表示した画面です。フィルターにはワークフローのステータス等も必要に応じて追加すると良いと思います。
リソース ID をグループ化条件とすることで、IAM ユーザーの ARN が表示されるため、アカウント ID と IAM ユーザー名を確認できます。
作成したインサイトに対して、コマンド get-insight-results
で結果を取得できます。
インサイトの ARN を指定して利用します。インサイトの ARN は aws securityhub get-insights
コマンドで確認できます。
aws securityhub get-insight-results \
--insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139"
get-insight-results
の出力結果例です。
$ aws securityhub get-insight-results \
> --insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139"
{
"InsightResults": {
"InsightArn": "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139",
"GroupByAttribute": "ResourceId",
"ResultValues": [
{
"GroupByAttributeValue": "arn:aws:iam::111122223333:user/sandbox01-iam-user",
"Count": 1
},
{
"GroupByAttributeValue": "arn:aws:iam::444455556666:user/mgmt-iam-user",
"Count": 1
}
]
}
}
query オプションを利用して、出力内容をグループ化条件で指定したリソース ID のみにするコマンド例です。
aws securityhub get-insight-results \
--insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139" \
--query 'InsightResults.ResultValues[].[GroupByAttributeValue]' \
--output text
出力結果例です。
$ aws securityhub get-insight-results \
> --insight-arn "arn:aws:securityhub:ap-northeast-1:111122223333:insight/111122223333/custom/cb4a8405-dbed-42f1-96a5-c8f1acff0139" \
> --query 'InsightResults.ResultValues[].[GroupByAttributeValue]' \
> --output text
arn:aws:iam::111122223333:user/sandbox01-iam-user
arn:aws:iam::444455556666:user/mgmt-iam-user
AWS Security Hub のインサイトの結果を AWS CLI で取得できることを確認できました。
さいごに
AWS CLI を利用して、AWS Security Hub の検出結果から未利用の IAM ユーザーを検出する AWS Config ルールが非準拠になっているユーザー一覧を取得してみました。
今回は AWS Config ルールの結果で試してみましたが、他の検出結果も検索可能です。次のブログでは、一括で抑制するために検出結果を取得しており、参考になります。
以上、このブログがどなたかのご参考になれば幸いです。